# 字符串和编码
# 最新的Python 3版本中，字符串是以Unicode编码的
print('包含中文的str')
# 对于单个字符的编码，Python提供了ord()函数获取字符的整数表示，chr()函数把编码转换为对应的字符
print(ord('A'))
print(ord('中'))
print(chr(66))
print(chr(20014))

# Python对bytes类型的数据用带b前缀的单引号或双引号表示,要注意区分'ABC'和b'ABC'，前者是str，后者虽然内容显示得和前者一样，但bytes的每个字符都只占用一个字节
print('ABC'.encode('ascii'))    # 纯英文的str可以用ASCII编码为bytes，内容是一样的
# print('中文'.encode('ascii')) # 含有中文的str无法用ASCII编码，因为中文编码的范围超过了ASCII编码的范围，Python会报错。在bytes中，无法显示为ASCII字符的字节，用\x##显示
print('中文'.encode('utf-8'))     # 含有中文的str可以用UTF-8编码为bytes

print(b'ABC'.decode('ascii'))
print(b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8'))
print(b'\xe4\xb8\xad\xe6'.decode('utf-8',errors='ignore'))  # 如果bytes中包含无法解码的字节，decode()方法会报错,可以传入errors='ignore'忽略错误的字节

# 计算str包含多少个字符，可以用len()函数
print(len('ABC'))
print(len('中文'))
# len()函数计算的是str的字符数，如果换成bytes，len()函数就计算字节数
print(len('ABC'.encode('ascii')))
print(len('中文'.encode('utf-8')))    # 1个中文字符经过UTF-8编码后通常会占用3个字节，而1个英文字符只占用1个字节

# 格式化
# 占位符,%d整数 %f浮点数 %s字符串 %x十六进制整数  %%用来转义%，表示为一个%字符串
print('尊敬的%s您好，您本月使用话费%d元，%%' % ('尹本阳', 100))
# format格式化字符串
print('Hello,{0}成绩提升了{1:.1f}%' .format('小明', 17.254))
print('中文'.encode('gb2312'))
